package com.example.design.pattern.structure

/**
 *目的：将两个能够独立变化的类分开，不用继承，继承会造成类的爆炸增长
优点：抽象分离，易扩展，细节透明
缺点：会增加系统的设计难度
 **/
interface Color {
    fun draw(box: String)
}

//合成复用原则
abstract class Box(val color: Color) {
    abstract fun getBox()
}

class Red : Color {
    override fun draw(box: String) {
        print("red$box")
    }

}

//依赖倒置
class RedBox(color: Color) : Box(color) {
    override fun getBox() {
        color.draw("box")
    }
}

class Use {
    fun main() {
        val red = Red()
        val redBox = RedBox(red)
        redBox.getBox()
    }
}